package com.zengqingfa.designpattern.structure.flyweight;

import java.util.HashMap;
import java.util.Map;

/**
 * @author zengqingfa
 * @className FlyWeightFactory
 * @description 享元工厂类
 * @create 2021/8/29 15:18
 */
public class FlyWeightFactory {

    private Map<Character, FlyWeight> map = new HashMap<Character, FlyWeight>();

    /**
     * 客户端不可以直接将具体享元类实例化，而必须通过一个工厂对象，利用一个factory()方法得到享元对象。
     * 一般而言，享元工厂对象在整个系统中只有一个，因此也可以使用单例模式。
     * 当客户端需要单纯享元对象的时候，需要调用享元工厂的factory()方法，并传入所需的单纯享元对象的内蕴状态，
     * 由工厂方法产生所需要的享元对象。
     *
     * @param state
     * @return
     */
    public FlyWeight factory(Character state) {
        //先从缓存中查找对象
        FlyWeight fly = map.get(state);
        if (fly == null) {
            //如果对象不存在则创建一个新的Flyweight对象
            fly = new ConcreteFlyweight(state);
            //把这个新的Flyweight对象添加到缓存中
            map.put(state, fly);
        }
        return fly;
    }
}